perm filename VIEWER.FAI[GEM,HE]2 blob
sn#060866 filedate 1973-09-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00019 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00007 00002 TITLE VIEWER - IMAGE FORMING SUBROUTINES - JULY 1972.
C00011 00003 SUBR(IIIDPY,WINDOW,GLASS) Display device routine. *
C00013 00004 SUBR(SHOW1,WND,POG) DISPLAY ALL EDGES IN VIEW.
C00026 00005 SUBR(SHOW2,WND,POG) VECTOR HIDDEN LINE IMAGE.
C00028 00006 SUBR(CROP,WINDOW)
C00030 00007 SUBR(PPROJ,CAMERA,WORLD)
C00033 00008 SUBR(VPROJ,VERTEX,CAMERA) TRANSLATE VERTEX TO CAMERA LOCUS.
C00035 00009 SUBR(UNPROJECT,VERTEX,CAMERA)
C00037 00010 SUBR(FACOEF,BF,FLAG) FACE COEFFICIENTS.
C00040 00011 SUBR(ENORM,BODY) COMPUTE EDGE NORMALS FROM FACE NORMALS.
C00042 00012 SUBR(ZCLIPF,FACE,CAMERA)
C00044 00013 SUBR(FMRK,WORLD) MARK POTENT FACES.
C00047 00014 SUBR(EMRK,WORLD) MARK POTENT EDGES FOR OCCULT.
C00050 00015 SUBR(ZCLIP,VERT1,VERTU,VERT2,CAMERA)
C00052 00016 SUBR(XYCLIP)
C00054 00017 XY-CLIPPER continued.
C00056 00018 SUBR(CLIPER,WINDOW)
C00058 00019 FOR ALL THE BODIES.
C00068 ENDMK
C⊗;
TITLE VIEWER - IMAGE FORMING SUBROUTINES - JULY 1972.
EXTERN DPYSTR,DPYBUF,AIVECT,AVECT,RIVECT,RVECT
EXTERN DPYBRT,DPYBIG,DPYOUT,DPYSET
EXTERN YDPY,EXTARW
EXTERN OTHER,VCW,VCCW,ECCW
EXTERN KLJUTS,KLJOTS,KLTMPS
EXTERN UNIVERSE,DPYFLG,PLTFLG
;VARIABLES GLOBAL TO VIEWER SUBROUTINES.
DECLARE{XL,XH,YL,YH}
INTERN XL,XH,YL,YH,SOX,SOY,MAG
DECLARE{FOCAL,LDZ}
DECLARE{SCALEX,SCALEY}
DECLARE{SOX,SOY,MAG}
DECLARE{CAMFRAME}
DECLARE{FOLDCNT,EDGECNT}
DECLARE{CAMERA,WINDOW,WORLD,GLASS}
DECLARE{ALLSHARP}
SUBR(GEODPY) ;GEOMED'S DISPLAY REFRESH
;--------------------------------------------------------------------
LACI 1↔DAC GLASS#
LAC 1,UNIVERSE
CW 1,1↔DAC 1,W0 ;FIRST WINDOW OF DISPLAY RING.
L1: DAC 1,W
PUSH P,1↔PUSH P,GLASS
LAC 1,DPYFLG
DZM DMODE↑↔CAIN 1,3↔DOM DMODE ;OCCULT DIAGONOSTICS.
PUSHJ P,@[SHOW2↔SHOW3↔SHOW1↔SHOW2](1)
AOS GLASS
L2: LAC 1,W↔SIS 1,1 ;NEXT WINDOW OF THE NOW DISPLAY RING.
CAME 1,W0↔GO L1
POP0J
DECLARE{W,W0}
ENDR GEODPY;7/12/73(BGB)---------------------------------------------
SUBR(IIIDPY,WINDOW,GLASS) ;Display device routine. *
COMMENT ⊗------------------------------------------------------------
⊗↔ E←←16
CALL(DPYSET,DPYBUF) ;NEW POG
;DISPLAY WINDOW FRAME.
LAC 1,WINDOW
NIP 1(1)↔DAC XL ;PICK UP 2D CLIPPER WINDOW
NAP 1(1)↔DAC XH
NIP 2(1)↔DAC YL
NAP 2(1)↔DAC YH
TESTZ 1,DARKEN↔GO L0
CALL(AIVECT,XL,YL) ;MAKE A BOARDER
CALL(AVECT,XH,YL)
CALL(AVECT,XH,YH)
CALL(AVECT,XL,YH)
CALL(AVECT,XL,YL)
;DISPLAY THE VISIBLE EDGE LIST.
L0: LAC E,WINDOW
NCAMR E,E↔PWRLD E,E ;GET THE WORLD.
JUMPE E,L3 ;NOTHING THERE, RETURN
PED E,E↔SKIPA ;FIRST EDGE OF WORLD.
L1: ALT2 E,E↔JUMPE E,L3 ;GET AN EDGE.
X1DC 1,E↔Y1DC 2,E
CALL(AIVECT,1,2)
X2DC 1,E↔Y2DC 2,E
CALL(AVECT,1,2)
PVT 1,E↔CALL(YDPY,1) ;CHECK EACH VERTEX FOR YNODES
L2: NVT 1,E↔CALL(YDPY,1)
GO L1
L3: CALL(DPYOUT,GLASS)
POP2J
BEND IIIDPY; BGB 5 FEB 1973 --------------------------------------
DECLARE{TX,TY}
SUBR(SHOW1,WND,POG) ;DISPLAY ALL EDGES IN VIEW.
COMMENT ⊗---------------------------------------------------------
ZERO WINDOW ARGUMENT PICKS UP THE DEFAULT WINDOW.
⊗
SETOM ALLSHARP
LAC 2,UNIVERSE↔SKIPN 1,WND↔CW 1,2↔DAC 1,WINDOW
NCAMR 1,1↔DAC 1,CAMERA↔JUMPE 1,POP2J.
PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
IFN SAIL,{PUSHP 16↔PUSHP 12} ;SAVE SAIL.
CALL(PPROJ,CAMERA,WORLD)
CALL(EMRKALL,WORLD)
CALL(CLIPER,WINDOW)
CALL(IIIDPY,WINDOW,POG)
IFN SAIL,{POPP 12↔POPP 16} ;RESTORE SAIL.
POP2J
ENDR SHOW1;3/16/73(BGB)-------------------------------------------
SUBR(SHOW3,WND,POG) ;DISPLAY BACKSIDED FACES REMOVED.
COMMENT ⊗-------------------------------------------------------
ZERO WINDOW ARGUMENT PICKS UP THE DEFAULT WINDOW.
⊗
SETZM ALLSHARP
LAC 2,UNIVERSE↔SKIPN 1,WND↔CW 1,2↔DAC 1,WINDOW
NCAMR 1,1↔DAC 1,CAMERA↔JUMPE 1,POP2J.
PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
IFN SAIL,{PUSHP 16↔PUSHP 12} ;SAVE SAIL.
CALL(PPROJ,CAMERA,WORLD)
CALL(FMRK,WORLD)
CALL(EMRK,WORLD)
CALL(CLIPER,WINDOW)
CALL(IIIDPY,WINDOW,POG)
IFN SAIL,{POPP 12↔POPP 16} ;RESTORE SAIL.
POP2J
ENDR SHOW3;3/16/73(BGB)-------------------------------------------
SUBR(SHOW2,WND,POG) ;VECTOR HIDDEN LINE IMAGE.
COMMENT ⊗------------------------------------------------------------
ZERO WINDOW ARGUMENT PICKS UP THE DEFAULT WINDOW.
⊗
SETZM ALLSHARP
LAC 2,UNIVERSE↔SKIPN 1,WND↔CW 1,2↔DAC 1,WINDOW
NCAMR 1,1↔DAC 1,CAMERA↔JUMPE 1,POP2J.
PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
IFN SAIL,{PUSHP 16↔PUSHP 12} ;SAVE SAIL.
CALL(PPROJ,CAMERA,WORLD)
CALL(FMRK,WORLD)
CALL(EMRK,WORLD)
CALL(OCCULT↑,WORLD)
CALL(KLJOTS,WORLD)
CALL(CLIPER,WINDOW)
CALL(IIIDPY,WINDOW,POG)
SKIPGE POG↔GO .+3
CALL(KLTMPS,WORLD)
IFN SAIL,{POPP 12↔POPP 16} ;RESTORE SAIL.
POP2J
ENDR SHOW2;3/16/73(BGB)----------------------------------------------
SUBR(TAKE,CAMR) ;SIMULATED TAKE A PICTURE.
COMMENT ⊗------------------------------------------------------------
⊗ DZM ALLSHARP
LAC 1,CAMR↔DAC 1,CAMERA↔JUMPE 1,POP1J.
PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
CALL(PPROJ,CAMERA,WORLD)
CALL(FMRK,WORLD)
CALL(EMRK,WORLD)
CALL(OCCULT↑,WORLD)
CALL(MKSIMG↑,CAMERA) ;MAKE A SIMULATED IMAGE.
CALL(KLTMPS,WORLD)
POP1J
ENDR TAKE;7/14/73(BGB)-----------------------------------------------
SUBR(CROP,WINDOW)
COMMENT ⊗------------------------------------------------------------
Crop object window to III destination window.
; XL ← (OX - MAG*LDX) MAX -511.
; XH ← (OX + MAG*LDX) MIN +511.
; YL ← (OY - MAG*LDY) MAX -384.
; YH ← (OY + MAG*LDY) MIN +384.
⊗↔ ACCUMULATORS{WND,C,OX,OY,LDX,LDY,MAG}
LAC WND,WINDOW
NCAMR C,WND↔JUMPE C,POP1J.
LAC MAG,-1(WND)
NIP OX,-2(WND)↔FLOAT OX,
NAP OY,-2(WND)↔FLOAT OY,
NAP LDX,1(C)↔FLOAT LDX,
NAP LDY,2(C)↔FLOAT LDY,
LAC LDX↔FMPR MAG↔DAC OX,1
FSBR 1,0↔FADR 0,OX↔FIXX 0,↔FIXX 1,
CAMGE 1,[-=511]↔LAC 1,[-=511]↔DIP 1,1(WND)
CAMLE 0,[ =511]↔LAC 0,[ =511]↔DAP 0,1(WND)
LAC LDY↔FMPR MAG↔DAC OY,1
FSBR 1,0↔FADR 0,OY↔FIXX 0,↔FIXX 1,
CAMGE 1,[-=384]↔LAC 1,[-=384]↔DIP 1,2(WND)
CAMLE 0,[ =384]↔LAC 0,[ =384]↔DAP 0,2(WND)
POP1J
ENDR CROP;3/13/73(BGB)--------------------------------------------
SUBR(PPROJ,CAMERA,WORLD)
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{B,F,E,V,CAM,E0,X,XX,Y,YY,Z,ZZ}
LAC B,WORLD↔$TYPE 0,B↔CAIE 0,$WORLD↔POP2J
;CLEAR FACE PZZ & NZZ BITS.
LAC B,WORLD
I0: CCW B,B↔CAME B,WORLD↔GO[LAC F,B
I1: PFACE F,F↔CAMN F,B↔GO I0↔MARKZ F,PZZ+NZZ↔GO I1]
;GET CAMERA SCALES AND FOCAL.
LAC CAM,CAMERA
LAC -3(CAM)↔DAC SCALEX
LAC -2(CAM)↔DAC SCALEY
HLLZ 3(CAM)↔DAC FOCAL
CDR 3(CAM)↔FLOAT↔DAC LDZ
;GET THE CAMERA'S FRAME.
LAC CAM,CAMERA
FRAME CAM,CAM
DAC CAM,CAMFRAME
;FOR ALL THE BODIES OF THE WORLD.
LAC B,WORLD
L1: CCW B,B↔CAMN B,WORLD↔POP2J
MARKZ B,VISIBLE
;FOR ALL THE VERTICES OF EACH BODY.
LAC V,B
L2: PVT V,V↔CAMN V,B↔GO L1
CALL(VPROJ,V,CAMERA)
;DO Z-CLIP MARKING WRT CAMERA CENTERED COORDINATES.
LAC X,[JUTBIT+JOTBIT+PZZ+NZZ+FOLDED+VISIBLE+POTENT+TBIT1+TBIT2+TBIT3]
ANDCAM X,(V) ;TURN 'EM ALL OFF.
SLACI X,(PZZ) ; + HALFSPACE, BEHIND THE CAMERA.
MOVN FOCAL
CAMGE ZZ,0 ;SKIP WHEN Zcc ≥ -FOCAL.
SLACI X,(NZZ) ; - HALFSPACE, INVIEW.
IORM X,(V)
PED E,V↔DAC E,E0↔JUMPE E,[
PFACE F,B↔IORM X,(F)↔GO L1] ;VERTEX BODY CASE.
L3: PVT 1,E↔CAME 1,V↔GO .+3↔PCW 1,E↔GO L4 ;AC1 ← ECCW(E,V).
NVT 1,E↔CAME 1,V↔GO L2 ↔NCW 1,E
L4: IORM X,(E)
PFACE F,E↔IORM X,(F)
NFACE F,E↔IORM X,(F)
LAC E,1↔CAME E,E0↔GO L3↔GO L2
ENDR PPROJ;1/14/73(BGB)----------------------------------------------
SUBR(VPROJ,VERTEX,CAMERA) ;TRANSLATE VERTEX TO CAMERA LOCUS.
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{B,F,E,V,CAM,E0,X,XX,Y,YY,Z,ZZ,FRM}
LAC CAM,CAMERA
FRAME FRM,CAM
LAC V,VERTEX
LAC X,XWC(V)↔FSBR X,XWC(FRM)
LAC Y,YWC(V)↔FSBR Y,YWC(FRM)
LAC Z,ZWC(V)↔FSBR Z,ZWC(FRM)
;ROTATE TO CAMERA ORIENTATION.
LAC XX,X↔FMPR XX,IX(FRM)
LAC Y↔FMPR IY(FRM)↔FADR XX,
LAC Z↔FMPR IZ(FRM)↔FADR XX,
LAC YY,X↔FMPR YY,JX(FRM)
LAC Y↔FMPR JY(FRM)↔FADR YY,
LAC Z↔FMPR JZ(FRM)↔FADR YY,
LAC ZZ,X↔FMPR ZZ,KX(FRM)
LAC Y↔FMPR KY(FRM)↔FADR ZZ,
LAC Z↔FMPR KZ(FRM)↔FADR ZZ,
;PERSPECTIVE TRANSFORMATION.
TESTZ CAM,NOTPER↔MOVSI ZZ,(<-16.0>)
FMPR XX,-3(CAM)↔FDVR XX,ZZ↔DAC XX,XPP(V)
FMPR YY,-2(CAM)↔FDVR YY,ZZ↔DAC YY,YPP(V)
MOVN Z, 3(CAM)↔FSC Z,=17
FDVR Z,ZZ↔DAC Z,ZPP(V)
POP2J
ENDR VPROJ;(BGB)-----------------------------------------------------
SUBR(UNPROJECT,VERTEX,CAMERA)
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{V,C,R,X,Y,Z,XX,YY,ZZ}
LAC V,VERTEX
LAC C,CAMERA
FRAME R,C
;UNDO PERSPECTIVE.
LACN Z,3(C)↔FSC Z,=17↔FDVR Z,ZPP(V) ;SCALEZ.
LAC Y,YPP(V)↔FMPR Y,Z↔FDVR Y,-2(C) ;SCALEY.
LAC X,XPP(V)↔FMPR X,Z↔FDVR X,-3(C) ;SCALEX.
;ROTATE BY TRANSPOSE OF CAMERA ORIENTATION.
LAC XX,X↔FMPR XX,IX(R)
LAC Y↔FMPR JX(R)↔FADR XX,
LAC Z↔FMPR KX(R)↔FADR XX,
LAC YY,X↔FMPR YY,IY(R)
LAC Y↔FMPR JY(R)↔FADR YY,
LAC Z↔FMPR KY(R)↔FADR YY,
LAC ZZ,X↔FMPR ZZ,IZ(R)
LAC Y↔FMPR JZ(R)↔FADR ZZ,
LAC Z↔FMPR KZ(R)↔FADR ZZ,
;TRANSLATE TO CAMERA LOCUS.
FADR XX,XWC(R)↔DAC XX,XWC(V)
FADR YY,YWC(R)↔DAC YY,YWC(V)
FADR ZZ,ZWC(R)↔DAC ZZ,ZWC(V)
POP2J
ENDR UNPROJECT;1/14/73(BGB)------------------------------------------
SUBR(FACOEF,BF,FLAG) ;FACE COEFFICIENTS.
COMMENT ⊗------------------------------------------------------------
FLAG=0 FOR WC, FLAG=-1 FOR PP.
⊗↔ ACCUMULATORS {Q2,Q3,E,V1,V2,V3,ABC,F,ARG,E0}
FOR @% Qε{XYZ}{FOR @$ N←1,3{ ;DEFINE X1,Y1,Z1, etc.
DEFINE Q%$N<Q%WC(V$N)>↔}}
;FOR ALL THE FACES OF EACH BODY.
LAC F,BF↔LAC ARG,(F) ;ORIGINAL ARG TYPE.
TLNN ARG,(BBIT)↔GO L2
L1: PFACE F,F
TEST F,FBIT↔POP2J
;FIRST THREE VERTICES CCW ABOUT THE FACE.
L2: PED E,F↔DAC E,E0↔ZIP 6(F);CLEAR FACE'S ALT LINK (FOR EHIDE TMP).
L3: SETQ(V1,{VCW,E,F})
SETQ(V2,{VCCW,E,F})
SETQ(E,{ECCW,E,F})
SETQ(V3,{VCCW,E,F})
;FLG TRUE FOR PERSPECTIVE PROJECTED FACOEF.
SKIPE FLAG↔GO[ADDI V1,7↔ADDI V2,7↔ADDI V3,7↔GO .+1]
;KK(F) ← X1*(Z2*Y3-Y2*Z3) + Y1*(X2*Z3-Z2*X3) + Z1*(Y2*X3-X2*Y3).
LAC 1,Z2↔FMPR 1,Y3↔LAC Y2↔FMPR Z3↔FSBR 1,0↔FMPR 1,X1↔LAC 2,X2↔FMPR 2,Z3
LAC Z2↔FMPR X3↔FSBR 2,0↔FMPR 2,Y1↔FADR 1,2↔LAC 3,Y2↔FMPR 3,X3
LAC X2↔FMPR Y3↔FSBR 3,0↔FMPR 3,Z1↔FADR 1,3↔DAC 1,KK(F)
MOVMS 1↔CAML 1,[1.0]↔GO L4 ;SKIP KK TOO SMALL.
CAME E,E0↔GO L3
;AA(F) ← (Z1*(Y2-Y3) + Z2*(Y3-Y1) + Z3*(Y1-Y2)).
L4: LAC 1,Y2↔FSBR 1,Y3↔FMPR 1,Z1↔LAC 0,1
LAC 1,Y3↔FSBR 1,Y1↔FMPR 1,Z2↔FADR 0,1
LAC 1,Y1↔FSBR 1,Y2↔FMPR 1,Z3↔FADR 0,1↔ DAC AA(F)↔FMPR↔DAC ABC
;BB(F) ← (X1*(Z2-Z3) + X2*(Z3-Z1) + X3*(Z1-Z2)).
LAC 1,Z2↔FSBR 1,Z3↔FMPR 1,X1↔LAC 0,1
LAC 1,Z3↔FSBR 1,Z1↔FMPR 1,X2↔FADR 0,1
LAC 1,Z1↔FSBR 1,Z2↔FMPR 1,X3↔FADR 0,1↔ DAC BB(F)↔FMPR↔FADRM ABC
;CC(F) ← (X1*(Y3-Y2) + X2*(Y1-Y3) + X3*(Y2-Y1)).
LAC 1,Y3↔FSBR 1,Y2↔FMPR 1,X1↔LAC 0,1
LAC 1,Y1↔FSBR 1,Y3↔FMPR 1,X2↔FADR 0,1
LAC 1,Y2↔FSBR 1,Y1↔FMPR 1,X3↔FADR 0,1↔ DAC CC(F)↔FMPR↔FADRM ABC
;NORMALIZE.
CALL(SQRT↑,ABC)↔SLACI(<1.0>)↔FDVR 1
FMPRM AA(F)↔FMPRM BB(F)↔FMPRM CC(F)↔FMPRM KK(F)
TLNN ARG,(BBIT)↔POP2J↔GO L1
ENDR FACOEF;1/14/73(BGB)---------------------------------------------
SUBR(ENORM,BODY) ;COMPUTE EDGE NORMALS FROM FACE NORMALS.
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{E,F1,F2}
LAC E,BODY
PED E,E↔CAMN E,BODY↔POP1J
PFACE F1,E↔NFACE F2,E
LAC AA(F1)↔FAD AA(F2)↔FSC -1↔DACN AA(E)
LAC BB(F1)↔FAD BB(F2)↔FSC -1↔DACN BB(E)
LAC CC(F1)↔FAD CC(F2)↔FSC -1↔DACN CC(E)
GO ENORM+1
ENDR ENORM;1/14/73(BGB)----------------------------------------------
SUBR(VNORM,BODY) ;COMPUTE VERTEX NORMALS FROM EDGE NORMALS.
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{V,E,E0,A,B,C}
LAC V,BODY
L1: PVT V,V↔CAMN V,BODY↔POP1J
PED E,V↔SKIPN E0,E↔POP1J ;VERTEX BODY CASE.
SETZB 0,A↔SETZB B,C
L2: FAD A,AA(E)↔FAD B,BB(E)↔FAD C,CC(E)
PVT 1,E↔CAME 1,V↔GO .+3↔PCW E,E↔GO .+5
NVT 1,E↔CAME 1,V↔AOJA .+5↔NCW E,E
CAME E,E0↔AOJA L2↔AOS
FLOAT↔FDV A,↔FDV B,↔FDV C,
DAC A,XPP(V)↔DAC B,YPP(V)↔DAC C,ZPP(V)
GO L1
ENDR VNORM;1/14/73(BGB)----------------------------------------------
SUBR(ZCLIPF,FACE,CAMERA)
COMMENT ⊗------------------------------------------------------------
⊗↔ GO L0
DECLARE{F,E,V,V1,V2,U0,U1,U2,ENEW,F0}
EXTERN MKFE,ESPLIT
;GET A PZZ VERTEX OF F0 - PZZ ≡ BEHIND THE CAMERA.
L0: LAC 1,FACE
DAC 1,F0↔DAC 1,U1↔DAC 1,F
PED 0,1↔DAC E
L1: SETQ(E,{ECCW,E,F})
SETQ(V,{VCCW,E,F})
TEST 1,PZZ↔GO L1
;GET FIRST NZZ VERTEX CCW AROUND F FROM E - NZZ ≡ INVIEW.
L2: SETQ(E,{ECCW,E,F})
SETQ(V,{VCCW,E,F})
TEST 1,NZZ↔GO L2
;MAKE Z-CLIP VERTEX.
LAC 1,E↔PVT 0,1↔CAMN 0,V↔GO .+3↔CALL(INVERT,E)
PVT 0,1↔DAC V1
NVT 0,1↔DAC V2
SETQ(U2,{ESPLIT,E})
LAC 1,U2↔MARK 1,TMPBIT
CALL(ZCLIP,V1,U2,V2,CAMERA)
CALL(UNPROJECT,U2,CAMERA)
LAC 1,U2↔MARK 1,NZZ
;MAKE Z-CLIP EDGE.
L3: LAC 1,U1↔TEST 1,VBIT↔GO L4 ;U1 IS FACE ON 1ST TIME THRU.
SETQ(ENEW,{MKFE,U1,F,U2})
LAC 2,ENEW↔MARK 2,TMPBIT ;NEW EDGE IS TEMPORARY.
NFACE 1,2↔MARK 1,PZZ ;NEW FACE IS BEHIND THE CAMERA.
EXCH 1,F↔MARKZ 1,PZZ↔MARK 1,NZZ ;OLD FACE IS INVIEW.
CAMN 1,F0↔POP2J↔GO .+3 ; ...EXIT OR PASS OVER.
L4: LAC U2↔DAC U0
;ADVANCE INTO THE NEXT FACE.
LAC U2↔DAC U1
SETQ(F,{OTHER,E,F})
CAME 1,F0↔GO L2
LAC U0↔DAC U2↔GO L3
ENDR ZCLIPF;1/14/73(BGB)---------------------------------------------
SUBR(FMRK,WORLD) ;MARK POTENT FACES.
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{W,B,F,Q,R}
;INITIALIZE THE WORLD'S POTENTIALLY VISIBLE FACE AND EDGE LISTS.
LAC 1,WORLD↔ZAC
PFACE. 0,1↔PED. 0,1↔NED. 0,1
NCAMR 1,1↔DAC 1,CAMERA#
;FOR ALL THE BODIES OF THE WORLD.
LAC B,WORLD↔DAC B,BODY#
L1: LAC B,BODY↔CCW B,B↔DAC B,BODY
CAMN B,WORLD↔POP1J
PED 1,B↔TEST 1,EBIT↔POP1J ;DON'T LOOK AT SINGLE POINTS
;FOR ALL THE FACES OF EACH BODY.
LAC F,B
L2: PFACE F,F↔DAC F,FACE#
CAMN F,BODY↔GO L1
MARKZ F,VISIBLE+POTENT ;HIDE.
TEST F,NZZ↔GO L2 ;FACE IS FULLY BEHIND THE CAMERA.
TEST F,PZZ↔GO L3 ;FACE IS PARTIALLY IN VIEW.
CALL(ZCLIPF,F,CAMERA) ;DO Z-CLIPPING.
LAC F,FACE
L3: CALL(FACOEF,F,[-1]) ;FLG=-1 FOR PP COORDINATES.
LAC F,FACE
LAC CC(F)↔FMPR LDZ
CAML KK(F)↔GO L2 ;FACE HAS BACKSIDE TOWARDS CAMERA.
;POTENTIALLY VISIBLE FACE.
L4: MARK F,POTENT
MARKZ F,TBIT1
LAC 1,WORLD↔PFACE 0,1
POTEN. 0,F↔PFACE. F,1
GO L2
ENDR FMRK;1/14/73(BGB)-----------------------------------------------
SUBR(EMRKALL,WORLD) ;MARK ALL EDGE AS POTENT.
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{B,E}
;FOR ALL THE BODIES OF THE WORLD.
LAC B,WORLD
L1: CCW B,B↔CAMN B,WORLD↔POP1J
;FOR ALL THE EDGES OF EACH BODY.
LAC E,B
L2: PED E,E↔CAMN E,B↔GO L1
MARK E,POTENT↔GO L2
ENDR EMRKALL;1/14/73(BGB)--------------------------------------------
SUBR(EMRK,WORLD) ;MARK POTENT EDGES FOR OCCULT.
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{Q,R,S,B,F1,F2,E,A}
ACCUMULATORS{V1,V2}
DZM FOLDCNT↔DZM EDGECNT
;FOR ALL THE BODIES OF THE WORLD.
LAC B,WORLD
L1: CCW B,B↔CAMN B,WORLD↔POP1J
;FOR ALL THE EDGES OF EACH BODY.
LAC E,B
L2: PED E,E↔CAMN E,B↔GO L1
DZM↔POTEN. 0,(E)
MARKZ E,FOLDED+VISIBLE+POTENT
PFACE F1,E
NFACE F2,E
;WHEN EITHER FACE IS POTENT THEN THE EDGE IS POTENT.
LAC(F1)↔IOR(F2)↔TLNN(POTENT)↔GO L2
MARK E,POTENT
;CONS THE EDGE INTO THE WORLD'S POTENTIALLY VISIBLE EDGE LIST.
LAC 1,WORLD↔PED 0,1↔SKIPN↔NED. E,1
PED. E,1↔POTEN. 0,E↔ZAC↔UFACE. 0,E ;CLEAR UFACE(E).
AOS EDGECNT↔CALL(ECOEF,E)
MARK V1,POTENT↔IORM(V2)
;WHEN ONLY ONE FACE IS POTENT THEN EDGE IS FOLDED.
LAC(F1)↔XOR(F2)↔TLNN(POTENT)↔GO L2
TEST F1,POTENT↔GO[CALL(INVERT↑,E)↔GO .+1];NOTA BENE !
MARK E,FOLDED↔IORM(V1)↔IORM(V2)
WAC↔UFACE. 0,E ;EMPTY UNDER FACE OF FOLDS.
GO L2
ENDR EMRK;1/14/73(BGB)-----------------------------------------------
;COMPUTE NORMALIZED EDGE COEFFICIENTS.
SUBR(ECOEF,EDGE)
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{V1,V2,S,B,F1,F2,E,A,FLG} ;BUT ONLY V1,V2,E,S.
LAC E,EDGE↔NVT V1,E↔PVT V2,E
LAC YPP(V2)↔FSBR YPP(V1)↔DAC AA(E)↔FMPR↔DAC 1
LAC XPP(V1)↔FSBR XPP(V2)↔DAC BB(E)↔FMPR↔FADR 1,0
LAC XPP(V2)↔FMPR YPP(V1)
LAC S,XPP(V1)↔FMPR S,YPP(V2)↔FSBR S↔DAC CC(E)
CALL(SQRT↑,1)↔SLACI(<1.0>)↔FDVR 0,1
FMPRM AA(E)↔FMPRM BB(E)↔FMPRM CC(E)
POP1J
ENDR ECOEF;7/23/73(BGB)----------------------------------------------
SUBR(ZCLIP,VERT1,VERTU,VERT2,CAMERA)
COMMENT ⊗------------------------------------------------------------
⊗↔ F←0 ↔ U←1
ACCUMULATORS{V1,V2,X1,Y1,Z1,X2,Y2,Z2,C}
SAVAC(11)
LAC C,CAMERA
;V1 BEHIND CAMERA PLANE, V2 VEFORE CAMERA PLANE.
CDR V1,VERT1
CDR U,VERTU
CDR V2,VERT2
LAC F,3(C) ;FOCAL.
;UNPROJECT TO CAMERA CENTERED COORDINATES.
FOR @$ I←1,2{
MOVN Z$I,3(C)↔FSC Z$I,=17↔FDVR Z$I,ZPP(V$I)
LAC Y$I,Z$I↔ FMPR Y$I,YPP(V$I)↔ FDVR Y$I,-2(C)
LAC X$I,Z$I↔ FMPR X$I,XPP(V$I)↔ FDVR X$I,-3(C)}
;PIERCE Z=-FOCAL PLANE BY SIMILAR TRIANGLES & REPROJECT.
FSBR X1,X2↔ FSBR Y1,Y2↔ FSBR Z1,Z2
FADR Z2,F↔MOVNS Z2
FMPR X1,Z2↔FDVR X1,Z1↔FADR X1,X2
FMPR X1,-3(C)↔FDVR X1,F↔DACN X1,XPP(U)
FMPR Y1,Z2↔FDVR Y1,Z1↔FADR Y1,Y2
FMPR Y1,-2(C)↔FDVR Y1,F↔DACN Y1,YPP(U)
LAC 2,3(C)↔FSC 2,=17↔FDVR 2,F↔DAC 2,ZPP(U)
;MARK U'S NSEW BITS.
ACCUMULATORS{XX,YY}
LAC XX,XPP(U)↔FMPR XX,MAG↔FADR XX,SOX↔XDC. XX,U↔HLLES
LAC YY,YPP(U)↔FMPR YY,MAG↔FADR YY,SOY↔YDC. YY,U↔HLLES
TYPE 0,U↔TRZ(NSEW);NSEW RESET.
CAMLE YY,YH↔TRO(NORTH)
CAMGE YY,YL↔TRO(SOUTH)
CAMLE XX,XH↔TRO(EAST)
CAMGE XX,XL↔TRO(WEST)
TRZ(PZZ)↔TRO(NZZ)
TYPE. 0,U
GETAC(11)↔POP4J
ENDR;1/14/73(BGB)------------------------------------------------------
SUBR(XYCLIP)
COMMENT ⊗------------------------------------------------------------
XY-CLIPPER, skips when portion is visible;
expect arguments in accumulators V1 & V2;
returns results via accumulator PTR.
⊗
ACCUMULATORS{E,V1,V2,X1,Y1,X2,Y2,PTR}
;GET NSEW BITS.
LDB 0,[POINT 4,(V1),8];
LDB 1,[POINT 4,(V2),8];
TRNE 0,(1)↔POP0J ;EASY OUTSIDER.
XDC X1,V1↔YDC Y1,V1 ;GET ENDS' LOCII.
XDC X2,V2↔YDC Y2,V2
;EASY INSIDER VERTICES.
JUMPE 0,[LAC X1↔FIXX↔DIP(PTR)
LAC Y1↔FIXX↔DAP(PTR)↔AOBJN PTR,.+1]
JUMPE 1,[LAC X2↔FIXX↔DIP(PTR)
LAC Y2↔FIXX↔DAP(PTR)↔AOBJN PTR,.+1↔GO L]
;COMPUTE EDGE COEFFICIENTS.
LAC Y1↔FSBR Y2↔DAC A
LAC X2↔FSBR X1↔DAC B
LAC X2↔FMPR Y1↔MOVNM C
LAC X1↔FMPR Y2↔FADRM C
;PARTIAL PRODUCTS.
LAC A↔FMPR XH↔DAC AXH
LAC A↔FMPR XL↔DAC AXL
LAC B↔FMPR YH↔DAC BYH
LAC B↔FMPR YL↔DAC BYL
;CORNER Q'S.
SETOM FLGO↔SETZM FLGZ
LAC AXH↔FADR BYH↔FADR C↔DAC QNE↔ANDM FLGO↔IORM FLGZ
LAC AXL↔FADR BYH↔FADR C↔DAC QNW↔ANDM FLGO↔IORM FLGZ
LAC AXL↔FADR BYL↔FADR C↔DAC QSW↔ANDM FLGO↔IORM FLGZ
LAC AXH↔FADR BYL↔FADR C↔DAC QSE↔ANDM FLGO↔IORM FLGZ
;HARD OUTSIDER CASES.
SKIPGE FLGO↔POP0J
SKIPL FLGZ↔POP0J
;XY-CLIPPER continued.
;NORTH BORDER CROSSING.
LAC QNE↔XOR QNW↔SKIPL↔GO L2
LAC Y1↔CAMGE Y2↔LAC Y2↔CAMG YH↔GO L2
LAC BYH↔FADR C↔MOVNS↔FDVR A↔FIXX↔DIP(PTR)
LAC YH↔FIXX↔DAP(PTR)
AOBJN PTR,.+2↔GO L
;SOUTH BORDER CROSSING.
L2: LAC QSE↔XOR QSW↔SKIPL↔GO L3
LAC Y1↔CAMLE Y2↔LAC Y2↔CAML YL↔GO L3
LAC BYL↔FADR C↔MOVNS↔FDVR A↔FIXX↔DIP(PTR)
LAC YL↔FIXX↔DAP(PTR)
AOBJN PTR,.+2↔GO L
;EAST BORDER CROSSING.
L3: LAC QSE↔XOR QNE↔SKIPL↔GO L4
LAC X1↔CAMGE X2↔LAC X2↔CAMG XH↔GO L4
LAC XH↔FIXX↔DIP(PTR)
LAC AXH↔FADR C↔MOVNS↔FDVR B↔FIXX↔DAP(PTR)
AOBJN PTR,.+2↔GO L
;WEST BORDER CROSSING.
L4: LAC QSW↔XOR QNW↔SKIPL↔GO L5
LAC X1↔CAMLE X2↔LAC X2↔CAML XL↔GO L5
LAC XL↔FIXX↔DIP(PTR)
LAC AXL↔FADR C↔MOVNS↔FDVR B↔FIXX↔DAP(PTR)
AOBJN PTR,.+2↔GO L
;STRANGE EXIT - VMARK & ECOEF ARE INCONSISTENT.
L5: OUTSTR[ASCIZ/XY-CLIPPER FALL THRU !
/]↔ POP0J
;VISIBLE PORTION EXIT.
L: AOS(P)↔POP0J
DECLARE{A,B,C,FLGO,FLGZ,AXH,AXL,BYH,BYL,QNE,QNW,QSW,QSE}
ENDR XYCLIP;1/14/73(BGB)---------------------------------------------
SUBR(CLIPER,WINDOW)
COMMENT ⊗------------------------------------------------------------
⊗↔ ACCUMULATORS{E,V1,V2,X1,Y1,X2,Y2,PTR,S12,B}
X←←X1 ↔ Y←←Y1 ↔ V←←V1
;SET VISIBLE EDGE LIST TO NIL AND RESET EDGE COUNT.
SETZM CNT
SETZM LINK
;GET THE 2D CLIP WINDOW FRAME.
LAC 1,WINDOW↔NCAMR 0,1↔DAC CAMERA#
NIP 1(1)↔FLOAT↔DAC XL
NAP 1(1)↔FLOAT↔DAC XH
NIP 2(1)↔FLOAT↔DAC YL
NAP 2(1)↔FLOAT↔DAC YH
;WINDOW SOURCE-OBJECT MAPPING.
LAC -1(1)↔DAC MAG
NIP 2,-3(1)↔FLOAT 2,↔FMPR 2,MAG
NIP 0,-2(1)↔FLOAT↔FSB 2↔DAC SOX
NAP 2,-3(1)↔FLOAT 2,↔FMPR 2,MAG
NAP 0,-2(1)↔FLOAT↔FSB 2↔DAC SOY
;FOR ALL THE BODIES OF THE WINDOW'S CAMERA'S SYNTHETIC & PERCEIVED IMAGES.
LAC B,WINDOW
NCAMR B,B↔PIMAG B,B↔SKIPE B↔CALL(L1) ;PERCIEVED IMAGE BODIES.
LAC B,WINDOW
NCAMR B,B↔SIMAG B,B↔SKIPE B↔CALL(L1) ;SYNTHETIC IMAGE BODIES.
;FOR ALL THE BODIES OF THE WORLD.
LAC B,WINDOW
NCAMR B,B↔PWRLD B,B
CALL(L1)
LAC 1,LINK↔PED. 1,B ;WORLD.
POP1J
;FOR ALL THE BODIES.
L1: CCW B,B↔TEST B,BBIT↔POP0J
;FOR ALL THE VERTICES OF EACH BODY.
LAC V,B
L1A: PVT V,V↔CAMN V,B↔GO L2-1
TESTZ V,POTENT↔ZAP 7(V) ;(OCCULT EXPEDIENCY).
CALL(VMARK2)
PY 1,V↔JUMPE 1,L1A
PUSH P,V↔PUSH P,B
YLOOP: YCODE 0,1
CAIN $TEXTHD↔GO[MARKZ 1,TBIT1↔CALL(VPROJ,1,CAMERA)↔LAC V,1(P)
CALL(VMARK2)↔LAC 1,V↔GO YCONT]
CAIN 0,$ARROW↔GO[CALL(EXTARW,1,CAMERA)↔LAC 1,1(P)↔GO YCONT]
YCONT: PY 1,1↔JUMPN 1,YLOOP
POP P,B↔POP P,V↔GO L1A
;FOR ALL THE EDGES OF EACH BODY.
LAC E,B
L2: PED E,E
CAMN E,B↔GO L1
TEST E,FOLDED↔SKIPE ALLSHARP↔GO L2A
TESTZ E,NSHARP↔GO L2
L2A: TESTZ E,DARKEN↔GO L2
TEST E,VISIBLE∨POTENT↔GO L2
;DOES EDGE NEED Z-CLIPPING.
PVT V1,E↔NVT V2,E↔LACI PTR,U
;PZZ ≡ BEHIND THE CAMERA.
TESTZ V2,PZZ↔EXCH V1,V2 ;INSURE V2 IS INVIEW, IF EITHER BE.
TESTZ V2,PZZ↔GO L2 ;EDGE IS FULLY BEHIND THE CAMERA.
TEST V1,PZZ↔GO L3 ;EDGE IS FULLY BEFORE THE CAMERA.
;CALL SUB-CLIPPER-ROUTINES.
SETQ(V1,{ZCLIP,V1,PTR,V2,CAMERA})
L3: SLACI PTR,-2↔LAPI PTR,-3(E) ;AOBJN PTR.
CALL(XYCLIP)↔GO L2 ;EDGE NOT VISIBLE IN WINDOW.
;CONS EDGE INTO VISIBLE EDGE LIST.
AOS CNT
MARK E,VISIBLE ;EDGE IS VISIBLE IN WINDOW.
LAC 1,LINK↔ALT2. 1,E
DAC E,LINK↔GO L2
;PSEUDO VERTEX FOR Z-CLIPPER.
0↔0↔0↔U: BLOCK 9↔CNT:0↔LINK:0
;COMPUTE DISPLAY COORDINATES OF A VERTEX.
VMARK2: LAC X,XPP(V)↔FMPR X,MAG↔FADR X,SOX↔XDC. X,V↔HLLES X
LAC Y,YPP(V)↔FMPR Y,MAG↔FADR Y,SOY↔YDC. Y,V↔HLLES Y
;DO XY-CLIP MARKING.
TYPE 0,V↔TRZ(NSEW);NSEW RESET.
CAMLE Y,YH↔TRO(NORTH)
CAMGE Y,YL↔TRO(SOUTH)
CAMLE X,XH↔TRO(EAST)
CAMGE X,XL↔TRO(WEST)
TYPE. 0,V↔POP0J
ENDR;2/5/73(BGB)-----------------------------------------------------
END